Jak obliczyć różnicę dat [ilość dni, miesięcy, lat]

Adam Boduch

A wiec oto rozwiazanie:

var
OldDate, Date: TDateTime;
wYear, wYear2, wMonth, wMonth2, wDay, wDay2 : Word;
fYear, fMonth, fDay : Word;
begin
OldDate := Now; // pobieranie dziesiejszej daty
DecodeDate(OldDate, wYear, wMonth, wDay);

Date := StrToDate('01-10-10');
DecodeDate(Date, wYear2, wMonth2, wDay2);

fYear := wYear - wYear2;
fMonth := wMonth - wMonth2;
fDay := wDay - wDay2;
ShowMessage(Format('Różnica dni: %d, miesięcy: %d, lat: %d',
[fDay, fMonth, fYear]));

Innym sposobem (w nowszych wersjach Delphi) jest użycie funkcji:
DaysBeetween, WeeksBeetween, MonthsBeetween, YearsBeetween i jeszcze wielu innych znajdujących się w module DateUtils. [Dryobates]
fYear := YearsBeetween(wYear, wYear2);

5 komentarzy

Ja robiłem coś takiego jakieś 3 lata temu, męczyłem się straszliwie aby uzyskać poprawne wyniki ale udało się.
Nie będe wklejał kodu bo wygląda strasznie. Jak każda z moich wypoconych producji.

Z tego, co pamiętam, to najpierw trzeba obliczyć ilość dni w roku, potem (dla uzupełnienia) ilość dni w miesiącu (uwzględniając lata przestępne, tzn.:

if (rok mod 100=0) and (rok mod 400<>0) then
iloscdni:=29
else
if (rok mod 4=0) then
iloscdni:=29
else
iloscdni:=28

co do lutego, jak i obliczania ilosci dni w roku).

Tak Flabra każdy...

Trzeba sobie zdefiniowac funkcje min() lub max() dla daty i od późniejszej odjąć wcześniejszą. Wszystko będzie wtedy oki. (Ale na to chyba każdy sam może wpaść).

Błędny sposób !!!
Aż dziwne, że nikt wcześniej tego nie zauważył...

Załóżmy, że jest 12 stycznia 2003, a datą którą odejmiemy jest 6 grudnia 1983.

Wynikiem zwróconym przez podaną wyżej procedurę będzie:
UWAGA NA ZNAKI !!!

"Różnica dni: 6 dni, miesięcy: -11 miesięcy, lat: 20 lat"...

Bez sensu!!!

Różnica dni i lat dodatnia, a miesięcy ujemna !!!

PROBLEM WYDAJE SIE BANALNY,
A JEDNAK...